'''
Author: GY_books 2567610535@qq.com
Date: 2023-12-22 16:14:08
LastEditTime: 2024-09-20 19:58:34
LastEditors: GY_books 2567610535@qq.com
FilePath: \my-flask-api\db\mysql.py
描述: MySQL 链接&查询封装
'''
# -*- coding:utf-8 -*-

import pymysql

from config import MSQL_DB_CONFIG

class SQLManager(object):

	# 初始化实例方法
	def __init__(self):
		self.conn = None
		self.cursor = None
		self.connect()

	# 连接数据库
	def connect(self):
		try:
			# self.conn = pymysql.connect(
			# 	host=MSQL_DB_CONFIG["host"],
			# 	port=MSQL_DB_CONFIG["port"],
			# 	user=MSQL_DB_CONFIG["user"],
			# 	passwd=MSQL_DB_CONFIG["passwd"],
			# 	db=MSQL_DB_CONFIG["db"],
			# 	charset=MSQL_DB_CONFIG["charset"]
			# )
			self.conn = pymysql.connect(**MSQL_DB_CONFIG)
			self.cursor = self.conn.cursor(cursor=pymysql.cursors.DictCursor)
		except:
			print('数据库连接出错')
	# 查询多条数据
	def select(self, sql, args=None):
		try:
			self.cursor.execute(sql, args)
			result = self.cursor.fetchall()
			return result
		except:
			print('数据库操作错误sql:',sql)
			return False

	# 查询单条数据
	def find(self, sql, args=None):
		try:
			self.cursor.execute(sql, args)
			result = self.cursor.fetchone()
			return result
		except:
			print('数据库操作错误sql:',sql)
			return False

	# 执行单条SQL语句
	def update(self, sql, args=None):
		try:
			self.cursor.execute(sql, args)
			# self.cursor.fetchall()
			self.conn.commit()	
			return True
		except:
			print('数据库操作错误sql:',sql)
			return False
		# return res,res1

	# 我如果要批量执行多个创建操作，虽然只建立了一次数据库连接但是还是会多次提交，可不可以改成一次连接，
	# 一次提交呢？
	# 可以，只需要用上pymysql的executemany()
	# 方法就可以了。
	# 执行多条SQL语句
	def multi_modify(self, sql, args=None):
		self.cursor.executemany(sql, args)
		self.conn.commit()

	# 创建单条记录的语句
	def create(self, sql, args=None):
		self.cursor.execute(sql, args)
		self.conn.commit()
		last_id = self.cursor.lastrowid
		return last_id

	# 关闭数据库cursor和连接
	def close(self):
		self.cursor.close()
		self.conn.close()
	
	def handleSqlStr(self,table,where=None,order=None,limit=None):
		selectStr = f"SELECT * FROM {table}"
		whereStr = f"WHERE "
		pass

	# 最后，我们每次操作完数据库之后都要手动关闭，可不可以写成自动关闭的呢？
	# 联想到我们之前学过的文件操作，使用with语句可以实现缩进结束自动关闭文件句柄的例子。
	# 我们来把我们的数据库连接类SQLManager类再优化下，使其支持with语句操作。
	# 进入with语句自动执行
	def __enter__(self):
		return self

	# 退出with语句块自动执行
	def __exit__(self, exc_type, exc_val, exc_tb):
		self.close()

